home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Eudora 1.3.1 / source / prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  19.7 KB  |  756 lines  |  [TEXT/MPS ]

  1. #define FILE_NUM 31
  2. /* Copyright (c) 1990-1992 by the University of Illinois Board of Trustees */
  3. #pragma load EUDORA_LOAD
  4. #pragma segment Prefs
  5.  
  6. void NewCreator(DialogPtr dl);
  7. void FontHasChanged(void);
  8. Boolean GetHexPath(UPtr folder,UPtr volpath);
  9. int BadPrefItem(DialogPtr dialog);
  10.  
  11. #define PText(item,pref) SetDIText(pd,item,GetPref(scratch,pref))
  12. #define PState(item,pref) SetDItemState(pd,item,PrefIsSet(pref))
  13. #define SPText(item,pref) do {                                    \
  14.     GetDIText(pd,item,scratch);                                     \
  15.     TrimWhite(scratch);                                                     \
  16.     ChangeStrn(PREF_STRN,pref,scratch);                     \
  17.     } while (0)
  18. #define RPState(item,pref) SetDItemState(pd,item,!PrefIsSet(pref))
  19. #define SPState(item,pref) \
  20.     ChangeStrn(PREF_STRN,pref,GetDItemState(pd,item)?&y:&n)
  21. #define SRPState(item,pref) \
  22.     ChangeStrn(PREF_STRN,pref,GetDItemState(pd,item)?&n:&y)
  23. #define PMenu(item,pref) SetDIPopup(pd,item,GetPref(scratch,pref))
  24. #define SPMenu(item,pref) \
  25.     ChangeStrn(PREF_STRN,pref,GetDIPopup(pd,item,scratch))
  26. /**********************************************************************
  27.  * DoNetPreferences - let the user diddle network preferences
  28.  **********************************************************************/
  29. void DoNetPreferences(void)
  30. {
  31.     DialogPtr pd;
  32.     short dItem;
  33.     int startAt;
  34.     Str255 scratch;
  35.     Str63 volpath,folder;
  36.     Boolean newFont = False;
  37.     Boolean done;
  38.     Rect junk;
  39.     Handle cntl;
  40.     long dirId;
  41.     short y='\01y';             /* used by the SPState macro */
  42.     short n='\01n';             /* used by the SPState macro */
  43.     short size = GetRLong(BOX_SIZE_FONT_SIZE);
  44.     static short ptextItems[] =
  45.          {NPRDL_POP, NPRDL_SMTP, NPRDL_PH, NPRDL_RETURN, NPRDL_INTERVAL,
  46.             NPRDL_CREATOR, NPRDL_FONT_SIZE, NPRDL_MWIDTH, NPRDL_MHEIGHT,
  47.             NPRDL_PRINT_FONT_SIZE, NPRDL_AUTOHEX_VOLPATH,NPRDL_AUXUSR,NPRDL_REALNAME};
  48.     static short ptextPrefs[] = 
  49.          {PREF_POP, PREF_SMTP, PREF_PH, PREF_RETURN, PREF_INTERVAL,
  50.             PREF_CREATOR, PREF_FONT_SIZE, PREF_MWIDTH, PREF_MHEIGHT,
  51.             PREF_PRINT_FONT_SIZE, PREF_AUTOHEX_VOLPATH,PREF_AUXUSR,PREF_REALNAME};
  52.     
  53.     SetDAFont(applFont);
  54.     pd=GetNewMyDialog(NPREF_DLOG,nil,InFront,ThirdCenterDialog);
  55.     SetDAFont(systemFont);
  56.     if (pd==nil)
  57.     {
  58.         WarnUser(COULDNT_PREF,MemError());
  59.         return;
  60.     }
  61.     ((MyWindowPtr)pd)->update = DlgUpdate;
  62.     SetPort(pd);
  63.     TextSize(size);
  64.     TextFont(applFont);
  65.     {
  66.         TEHandle teh = ((DialogPeek)pd)->textH;
  67.         ControlHandle cntl = ((WindowPeek)pd)->controlList;
  68.         (*teh)->txSize = size;
  69.         (*teh)->lineHeight = GetLeading(applFont,size);
  70.         (*teh)->fontAscent = GetAscent(applFont,size);
  71.     }            
  72.     
  73.     /*
  74.      * load up preference values
  75.      */
  76.     for (dItem=0;dItem<sizeof(ptextItems)/sizeof(short);dItem++)
  77.         PText(ptextItems[dItem],ptextPrefs[dItem]);
  78.     SetDItemState(pd,NPRDL_MACTCP,!PrefIsSet(PREF_TRANS_METHOD));
  79.     SetDItemState(pd,NPRDL_CTB,PrefIsSet(PREF_TRANS_METHOD));
  80.     PState(NPRDL_AUTOHEX,PREF_AUTOHEX);
  81.     PMenu(NPRDL_FONT_NAME,PREF_FONT_NAME);
  82.     GetPref(scratch,PREF_PRINT_FONT);
  83.     if (!*scratch)
  84.         if (FontIsFixed) GetRString(scratch,PRINT_FONT);
  85.         else GetPref(scratch,PREF_FONT_NAME);
  86.     SetDIPopup(pd,NPRDL_PRINT_FONT,scratch);
  87.     
  88.     GetPref(scratch,PREF_CREATOR_NAME);
  89.     GetDItem(pd,NPRDL_CREATOR_NAME,&dItem,&cntl,&junk);
  90.     SetCTitle(cntl,scratch);
  91.     GetPref(scratch,PREF_AUTOHEX_NAME);
  92.     GetDItem(pd,NPRDL_AUTOHEX_NAME,&dItem,&cntl,&junk);
  93.     SetCTitle(cntl,scratch);
  94.     if (!GetVolpath(GetPref(volpath,PREF_AUTOHEX_VOLPATH),scratch,&dirId))
  95.         SetDItemState(pd,NPRDL_AUTOHEX,False);
  96.     
  97.     /*
  98.      * now, display the dialog
  99.      */
  100.     ShowWindow(pd);
  101.     HiliteButtonOne(pd);
  102.     startAt = NPRDL_POP;
  103.     do
  104.     {
  105.         SelIText(pd,startAt,0,32767);
  106.         PushCursor(arrowCursor);
  107.         done=False;
  108.         do
  109.         {
  110.             ModalDialog(DlgFilter,&dItem);
  111.             switch (dItem)
  112.             {
  113.                 case NPRDL_POP:
  114. #ifndef KERBEROS
  115.                     InvalidatePasswords(False,True);
  116. #endif
  117.                     break;
  118.                 case NPRDL_AUXUSR:
  119. #ifndef KERBEROS
  120.                     InvalidatePasswords(True,False);
  121. #endif
  122.                     break;
  123.                 case NPRDL_MACTCP_LABEL:
  124.                 case NPRDL_CTB_LABEL:
  125.                     dItem = dItem==NPRDL_MACTCP_LABEL ? NPRDL_MACTCP : NPRDL_CTB;
  126.                 case NPRDL_MACTCP:
  127.                 case NPRDL_CTB:
  128.                     SetDItemState(pd,NPRDL_MACTCP,dItem==NPRDL_MACTCP);
  129.                     SetDItemState(pd,NPRDL_CTB,dItem==NPRDL_CTB);
  130.                     break;
  131.                 case NPRDL_AUTOHEX_LABEL:
  132.                 case NPRDL_AUTOHEX:
  133.                     if (GetDItemState(pd,NPRDL_AUTOHEX))
  134.                     {
  135.                         SetDItemState(pd,NPRDL_AUTOHEX,False);
  136.                         break;
  137.                     }
  138.                     else
  139.                     {
  140.                         GetDIText(pd,NPRDL_AUTOHEX_VOLPATH,volpath);
  141.                         if (GetVolpath(volpath,scratch,&dirId))
  142.                         {
  143.                             SetDItemState(pd,NPRDL_AUTOHEX,True);
  144.                             break;
  145.                         }
  146.                     }
  147.                     /* fall through here is deliberate */
  148.                 case NPRDL_AUTOHEX_NAME:
  149.                     GetDIText(pd,NPRDL_AUTOHEX_VOLPATH,volpath);
  150.                     if (GetHexPath(folder,volpath))
  151.                     {
  152.                         SetDItemState(pd,NPRDL_AUTOHEX,True);
  153.                         GetDItem(pd,NPRDL_AUTOHEX_NAME,&dItem,&cntl,&junk);
  154.                         SetCTitle(cntl,folder);
  155.                         SetDIText(pd,NPRDL_AUTOHEX_VOLPATH,volpath);
  156.                     }
  157.                     break;
  158.                 case NPRDL_FONT_NAME:
  159.                 case NPRDL_FONT_SIZE:
  160.                     newFont = True;
  161.                     break;
  162.                 case NPRDL_CREATOR_NAME:
  163.                     NewCreator(pd);
  164.                     break;
  165.                 default:
  166.                     done = True;
  167.                     break;
  168.             }
  169.         }
  170.         while(!done);
  171.         PopCursor();
  172.     }
  173.     while (dItem!=NPRDL_CANCEL&&dItem!=CANCEL_ITEM&&(startAt=BadPrefItem(pd)));
  174.     
  175.     if (dItem!=NPRDL_CANCEL && dItem!=CANCEL_ITEM)
  176.     {
  177.         /*
  178.          * suck out the values
  179.          */
  180.         RecountStrn(PREF_STRN);
  181.         for (dItem=0;dItem<sizeof(ptextItems)/sizeof(short);dItem++)
  182.             SPText(ptextItems[dItem],ptextPrefs[dItem]);
  183.         ChangeStrn(PREF_STRN,PREF_TRANS_METHOD,
  184.             GetDItemState(pd,NPRDL_MACTCP) ? "\pn" : "\py");
  185.         SPText(NPRDL_CREATOR,PREF_CREATOR);
  186.         GetDIText(pd, NPRDL_CREATOR,scratch);                             /* don't TrimWhite */
  187.         ChangeStrn(PREF_STRN, PREF_CREATOR,scratch);                /* don't TrimWhite */
  188.         SPState(NPRDL_AUTOHEX,PREF_AUTOHEX);
  189.         SPMenu(NPRDL_FONT_NAME,PREF_FONT_NAME);
  190.         SPMenu(NPRDL_PRINT_FONT,PREF_PRINT_FONT);
  191.         
  192.         GetDItem(pd, NPRDL_AUTOHEX_NAME,&dItem,&cntl,&junk);
  193.         GetCTitle(cntl,scratch);
  194.         ChangeStrn(PREF_STRN,PREF_AUTOHEX_NAME,scratch);
  195.         GetDItem(pd,NPRDL_CREATOR_NAME,&dItem,&cntl,&junk);
  196.         GetCTitle(cntl,scratch);
  197.         ChangeStrn(PREF_STRN,PREF_CREATOR_NAME,scratch);
  198. #ifndef KERBEROS
  199.         if (PrefIsSet(PREF_SAVE_PASSWORD))
  200.         {
  201.             ChangeStrn(PREF_STRN,PREF_PASS_TEXT,Password);
  202.             ChangeStrn(PREF_STRN,PREF_AUXPW,SecondPass);
  203.         }
  204.         else
  205. #endif
  206.         {
  207.             ChangeStrn(PREF_STRN,PREF_PASS_TEXT,"");
  208.             ChangeStrn(PREF_STRN,PREF_AUXPW,"");
  209.         }
  210.  
  211.         /*
  212.          * save the resource
  213.          */
  214.         UpdateResFile(SettingsRefN);
  215.         HPurge(GetResource('STR#',PREF_STRN));
  216.         
  217.         /*
  218.          * take necessary action
  219.          */
  220.         if (newFont) FontHasChanged();
  221.         GetPref(scratch,PREF_POP); UUPCIn = *scratch && scratch[1]=='!';
  222.         GetPref(scratch,PREF_SMTP); UUPCOut = *scratch && scratch[1]=='!';
  223.         NewPhHost();
  224.         AlertsTimeout = PrefIsSet(PREF_AUTO_DISMISS);
  225.         UseCTB = PrefIsSet(PREF_TRANS_METHOD);
  226.         CurTrans = UseCTB ? CTBTrans : TCPTrans;
  227.     
  228.         GetRString(NewLine,UseCTB ? CTB_NEWLINE : NEWLINE);
  229.         if (UseCTB) EnableItem(GetMHandle(SPECIAL_MENU),SPECIAL_CTB_ITEM);
  230.         else DisableItem(GetMHandle(SPECIAL_MENU),SPECIAL_CTB_ITEM);
  231.     }
  232.     else
  233.         ReleaseResource(GetResource('STR#',PREF_STRN));
  234.     
  235.     DisposDialog(pd);
  236. }
  237.  
  238.  
  239. /**********************************************************************
  240.  * DouserPreferences - let the user diddle private preferences
  241.  **********************************************************************/
  242. void DoUserPreferences(void)
  243. {
  244.     DialogPtr pd;
  245.     short dItem;
  246.     Boolean done;
  247.     short y='\01y';             /* used by the SPState macro */
  248.     short n='\01n';             /* used by the SPState macro */
  249.     Boolean redraw=False;
  250.     static short pstateItems[] =
  251.      {UPRDL_AUTO_COMPACT, UPRDL_AUTO_DISMISS, UPRDL_AUTO_EMPTY,
  252.         UPRDL_AUTO_SEND, UPRDL_BX_TEXT, UPRDL_DONT_DELETE, UPRDL_EASY_DELETE,
  253.         UPRDL_ICON_BAR, UPRDL_KEEP_OUTGOING, UPRDL_NEW_ALERT, UPRDL_NEW_SOUND,
  254.         UPRDL_NICK_FOLLOW, UPRDL_NO_BIGGIES, UPRDL_PARAGRAPHS, UPRDL_PLAIN_ARROW,
  255.         UPRDL_SAVE_PASSWORD, UPRDL_SEND_CHECK, UPRDL_SHOW_ALL, UPRDL_SHOW_SIZE,
  256.         UPRDL_SIG, UPRDL_SUPERCLOSE, UPRDL_TAB_IN_TEXT, UPRDL_WRAP_OUT,
  257.         UPRDL_ZOOM_OPEN, -UPRDL_EXCLUDE_HEADERS, -UPRDL_NO_APPLE_FLASH,
  258.         -UPRDL_NO_CMD_ARROW, -UPRDL_NO_PROGRESS, -UPRDL_NO_OPEN_IN,
  259.         UPRDL_REPLY_ALL, -UPRDL_NOT_ME, -UPRDL_NO_AUTO_OPEN};
  260.     static short pstatePrefs[] =
  261.      {PREF_AUTO_COMPACT, PREF_AUTO_DISMISS, PREF_AUTO_EMPTY,
  262.         PREF_AUTO_SEND, PREF_BX_TEXT, PREF_DONT_DELETE, PREF_EASY_DELETE,
  263.         PREF_ICON_BAR, PREF_KEEP_OUTGOING, PREF_NEW_ALERT, PREF_NEW_SOUND,
  264.         PREF_NICK_FOLLOW, PREF_NO_BIGGIES, PREF_PARAGRAPHS, PREF_PLAIN_ARROW,
  265.         PREF_SAVE_PASSWORD, PREF_SEND_CHECK, PREF_SHOW_ALL, PREF_SHOW_SIZE,
  266.         PREF_SIG, PREF_SUPERCLOSE, PREF_TAB_IN_TEXT, PREF_WRAP_OUT,
  267.         PREF_ZOOM_OPEN, -PREF_EXCLUDE_HEADERS, -PREF_NO_APPLE_FLASH,
  268.         -PREF_NO_CMD_ARROW, -PREF_NO_PROGRESS, -PREF_NO_OPEN_IN,
  269.         PREF_REPLY_ALL, -PREF_NOT_ME, -PREF_NO_AUTO_OPEN};
  270.     if ((pd=GetNewMyDialog(UPREF_DLOG,nil,InFront,ThirdCenterDialog))==nil)
  271.     {
  272.         WarnUser(COULDNT_PREF,MemError());
  273.         return;
  274.     }
  275.     ((MyWindowPtr)pd)->update = DlgUpdate;
  276.     
  277.     /*
  278.      * load up preference values
  279.      */
  280.     for (dItem=0;dItem<sizeof(pstateItems)/sizeof(short);dItem++)
  281.         if (pstateItems[dItem]>0)
  282.             PState(pstateItems[dItem],pstatePrefs[dItem]);
  283.         else
  284.             RPState(-pstateItems[dItem],-pstatePrefs[dItem]);
  285.  
  286.     /*
  287.      * now, display the dialog
  288.      */
  289.     ShowWindow(pd);
  290.     HiliteButtonOne(pd);
  291.     PushCursor(arrowCursor);
  292.     done=False;
  293.     do
  294.     {
  295.         ModalDialog(DlgFilter,&dItem);
  296.         switch (dItem)
  297.         {
  298.             case UPRDL_SHOW_SIZE:
  299.                 redraw = !redraw;
  300.                 /* fall through is deliberate */
  301.             default:
  302.                 SetDItemState(pd,dItem,!GetDItemState(pd,dItem));
  303.                 break;
  304.             case UPRDL_OK:
  305.             case UPRDL_CANCEL:
  306.             case CANCEL_ITEM:
  307.                 done = True;
  308.                 break;
  309.         }
  310.     }
  311.     while(!done);
  312.     PopCursor();
  313.     
  314.     if (dItem!=UPRDL_CANCEL && dItem!=CANCEL_ITEM)
  315.     {
  316.         /*
  317.          * suck out the values
  318.          */
  319.         RecountStrn(PREF_STRN);
  320.         for (dItem=0;dItem<sizeof(pstateItems)/sizeof(short);dItem++)
  321.             if (pstateItems[dItem]>0)
  322.                 SPState(pstateItems[dItem],pstatePrefs[dItem]);
  323.             else
  324.                 SRPState(-pstateItems[dItem],-pstatePrefs[dItem]);
  325.  
  326.         /*
  327.          * save the resource
  328.          */
  329.         UpdateResFile(SettingsRefN);
  330.         HPurge(GetResource('STR#',PREF_STRN));
  331.         FakeTabs = PrefIsSet(PREF_TAB_IN_TEXT);
  332.     }
  333.     else
  334.         ReleaseResource(GetResource('STR#',PREF_STRN));
  335.  
  336.     if (redraw)
  337.     {
  338.         TOCHandle tocH;
  339.         GrafPtr oldPort;
  340.         Rect r;
  341.         GetPort(&oldPort);
  342.         r.left = r.top = 0;
  343.         r.right = r.bottom = 20000;
  344.         for (tocH=TOCList;tocH;tocH=(*tocH)->next)
  345.         {
  346.             if ((*tocH)->win->qWindow.visible)
  347.             {
  348.                 SetPort((*tocH)->win);
  349.                 MyWindowDidResize((*tocH)->win,nil);
  350.                 RectRgn((*tocH)->win->qWindow.updateRgn,&r);
  351.             }
  352.         }
  353.         SetPort(oldPort);
  354.     }
  355.     DisposDialog(pd);
  356.  
  357. }
  358.  
  359. /************************************************************************
  360.  * NewCreator - allow the user to pick a new application
  361.  ************************************************************************/
  362. void NewCreator(DialogPtr dl)
  363. {
  364.     SFReply sfr;
  365.     Str63 junk;
  366.     Point where;
  367.     SFTypeList tl;
  368.     FInfo fi;
  369.     int err;
  370.     Rect r;
  371.     ControlHandle cntl;
  372.     
  373.     OpenProgress();
  374.     GetRString(junk,PICK_CREATOR);
  375.     Progress(NoChange,junk);
  376.     
  377.     StdFileSpot(&where,SFGETFILE_ID);
  378.     *junk = 0;
  379.     tl[0] = 'APPL';
  380.     SFPGetFile(where,junk,nil,1,tl,nil,&sfr,SFGETFILE_ID,DlgFilter);
  381.     if (sfr.good)
  382.     {
  383.         if (err=GetFInfo(sfr.fName,sfr.vRefNum,&fi))
  384.             FileSystemError(NO_FINFO,sfr.fName,err);
  385.         else
  386.         {
  387.             GetDItem(dl,NPRDL_CREATOR_NAME,&err,&cntl,&r);
  388.             SetCTitle(cntl,sfr.fName);
  389.             BlockMove(&fi.fdCreator,junk+1,4);
  390.             *junk = 4;
  391.             SetDIText(dl,NPRDL_CREATOR,junk);
  392.         }
  393.     }
  394.     CloseProgress();
  395. }
  396.     
  397. /************************************************************************
  398.  * FontHasChanged - the user changed the font on us on the fly.  Fix up
  399.  * windows.
  400.  ************************************************************************/
  401. void FontHasChanged(void)
  402. {
  403.     MyWindowPtr win;
  404.     short i;
  405.     GrafPtr oldPort;
  406.     
  407.     GetPort(&oldPort);
  408.     
  409.     FigureOutFont();
  410.     
  411.     for (win=FrontWindow();win;win=win->qWindow.nextWindow)
  412.         if (IsMyWindow(win))
  413.         {
  414.             SetPort(win);
  415.             TextFont(FontID);
  416.             TextSize(FontSize);
  417.             win->vPitch = FontLead;
  418.             win->hPitch = FontWidth;
  419.             switch (win->qWindow.windowKind)
  420.             {
  421.                 case COMP_WIN:
  422.                     for (i=0;i<HEAD_LIMIT;i++)
  423.                         TEFixup((*(MessHandle)win->qWindow.refCon)->txes[i]);
  424.                     TextFont(0);
  425.                     TextSize(0);
  426.                     break;
  427.                 case TEXT_WIN:
  428.                     TEFixup(WinTEH(win));
  429.                     break;
  430.                 case MESS_WIN:
  431.                     MyWindowDidResize(win,nil);
  432.                     TEFixup(Win2Body(win));
  433.                     TEFixup((*Win2MessH(win))->txes[SUBJ_HEAD-1]);
  434.                     break;
  435.                 case MBOX_WIN:
  436.                 case CBOX_WIN:
  437.                     win->vPitch = FontLead+FontDescent;
  438.                     CalcAllSumLengths((TOCHandle)win->qWindow.refCon);
  439.                     break;
  440.                 case PH_WIN:
  441.                     PhFixFont();
  442.                     break;
  443.                 case ALIAS_WIN:
  444.                     AliasesFixFont();
  445.                     break;
  446.             }
  447.             SetPort(win);
  448.             MyWindowDidResize(win,&win->contR);
  449.         }
  450.     RedrawAllWindows();
  451.     SetPort(oldPort);
  452. }
  453.  
  454. #pragma segment Main
  455. /************************************************************************
  456.  * SettingsPtr - put some data into the Settings file
  457.  ************************************************************************/
  458. short SettingsPtr(ResType type,UPtr name,short id,UPtr dataPtr, long dataSize)
  459. {
  460.     Handle rH = NuHandle(dataSize);
  461.     short err;
  462.     
  463.     if (!rH) return(MemError());
  464.     BlockMove(dataPtr,*rH,dataSize);
  465.     if (err=SettingsHandle(type,name,id,rH))
  466.         DisposHandle(rH);
  467.     return(err);
  468. }
  469.  
  470. /************************************************************************
  471.  * SettingsHandle - put some data into the Settings file
  472.  ************************************************************************/
  473. short SettingsHandle(ResType type,UPtr name,short id,UHandle    dataHandle)
  474. {
  475.     short oldRefN = CurResFile();
  476.     short err;
  477.     Handle oldDataHandle;
  478.     
  479.     UseResFile(SettingsRefN);
  480.     oldDataHandle = Get1Resource(type,id);
  481.     if (oldDataHandle!=nil)
  482.     {
  483.         RmveResource(oldDataHandle);
  484.         DisposHandle(oldDataHandle);
  485.     }
  486.     
  487.     AddResource(dataHandle,type,id,name?name:"");
  488.     err = ResError();
  489.     UseResFile(oldRefN);
  490.     return(err);
  491. }
  492.  
  493. /************************************************************************
  494.  * GetHexPath - get the auto-binhex path
  495.  ************************************************************************/
  496. Boolean GetHexPath(UPtr folder,UPtr volpath)
  497. {
  498.     Str31 volName;
  499.     long dirId;
  500.     short vRef;
  501.     Boolean result;
  502.     UPtr rev;
  503.     
  504.     if (!GetVolpath(volpath,volName,&dirId))
  505.     {
  506.         GetVol(volName,&vRef);
  507.         dirId = 2;
  508.     }
  509.     if (result=GetFolder(volName,&vRef,&dirId,True,True,True,True))
  510.     {
  511.         PCopy(volpath,volName);
  512.         PLCat(volpath,dirId);
  513.         for (rev=volpath+*volpath;*rev!=' ';rev--);
  514.         *rev = ':';
  515.         (void) GetDirName(volName,vRef,dirId,folder);
  516.     }
  517.     return(result);
  518. }
  519.  
  520. #pragma segment Util
  521. /************************************************************************
  522.  * PrefIsSet - is an on/off preference on?
  523.  ************************************************************************/
  524. Boolean PrefIsSet(short pref)
  525. {
  526.     Str255 scratch;
  527.     
  528.     GetPref(scratch,pref);
  529.     return(*scratch && scratch[1]=='y');
  530. }
  531.  
  532.  
  533. /************************************************************************
  534.  * GetPOPInfo - get pop user and account
  535.  ************************************************************************/
  536. void GetPOPInfo(UPtr user, UPtr host)
  537. {
  538.     Str255 scratch;
  539.     UPtr atSign;
  540.     
  541.     GetPref(scratch,PREF_POP);
  542.     if (*scratch && (atSign=strchr(scratch+1,'@')))
  543.     {
  544.         *atSign = *scratch - (atSign-scratch);
  545.         *scratch = atSign-scratch-1;
  546.         PCopy(user,scratch);
  547.         PCopy(host,atSign);
  548.         user[*user+1] = host[*host+1] = 0;
  549.     }
  550.     else
  551.         *user = *host = 0;
  552. }
  553.  
  554. /************************************************************************
  555.  * GetSMTPInfo - get SMTP host (fallback to POP host if necessary)
  556.  ************************************************************************/
  557. UPtr GetSMTPInfo(UPtr host)
  558. {
  559.     Str255 user;
  560.     GetPref(host,PREF_SMTP);
  561.     if (!*host)
  562.         GetPOPInfo(user,host);
  563.     return(host);
  564. }
  565.  
  566. /************************************************************************
  567.  * GetReturnAddr - get return address (fallback to POP account if necessary)
  568.  ************************************************************************/
  569. UPtr GetReturnAddr(UPtr addr,Boolean comments)
  570. {
  571.     UHandle canon;
  572.     Str255 realname;
  573.     
  574.     GetPref(addr,PREF_RETURN);
  575.     if (!*addr)
  576.         GetPref(addr,PREF_POP);
  577.     if (canon=SuckPtrAddresses(addr+1,*addr,comments))
  578.     {
  579.         *addr = 0;
  580.         if (!comments && **canon!='<') PCatC(addr,'<');
  581.         PCat(addr,*canon);
  582.         if (!comments && addr[*addr]!='>') PCatC(addr,'>');
  583.         addr[*addr+1] = 0;
  584.         DisposHandle(canon);
  585.     }
  586.     if (comments)
  587.     {
  588.         GetPref(realname,PREF_REALNAME);
  589.         if (*realname)
  590.         {
  591.             Str255 fmt,buffer;
  592.             GetRString(fmt,ADD_REALNAME);
  593.             utl_PlugParams(fmt,buffer,addr,realname,nil,nil);
  594.             PCopy(addr,buffer);
  595.         }
  596.     }
  597.     return(addr);
  598. }
  599.  
  600. /************************************************************************
  601.  * GetVolpath - check the auto-binhex path
  602.  ************************************************************************/
  603. Boolean GetVolpath(UPtr volpath,UPtr volName,long *dirId)
  604. {
  605.     Str31 maybeVol,maybeFolder;
  606.     UPtr colon;
  607.     long maybeId;
  608.     short oldVol,newVol;
  609.     short err;
  610.     
  611.     /*
  612.      * volpath is of the form "volname:dirId"; find that colon.
  613.      */
  614.     if (!*volpath) return(False);
  615.     for (colon=volpath+1;colon<volpath+*volpath;colon++) if (*colon==':') break;
  616.     if (*colon!=':') return(False);
  617.     
  618.     /*
  619.      * volume name
  620.      */
  621.     BlockMove(volpath,maybeVol,colon-volpath+1);
  622.     *maybeVol = colon-volpath;
  623.     
  624.     /*
  625.      * dirId
  626.      */
  627.     maybeId=0;
  628.     for (colon++;colon<=volpath+*volpath;colon++)
  629.         {maybeId *= 10; maybeId += (*colon)-'0';}
  630.  
  631.     /*
  632.      * now check it
  633.      */
  634.     GetVol(nil,&oldVol);
  635.     if (!(err=SetVol(maybeVol,0)))
  636.     {
  637.         GetVol(nil,&newVol);
  638.         if (!(err = GetDirName(maybeVol,0,maybeId,maybeFolder)))
  639.         {
  640.             *dirId = maybeId;
  641.             PCopy(volName,maybeVol);
  642.         }
  643.     }
  644.     SetVol(nil,oldVol);
  645.     return(!err);
  646. }
  647.  
  648. /************************************************************************
  649.  * SaveBoxLines - save the current setting of BoxLines
  650.  ************************************************************************/
  651. void SaveBoxLines(void)
  652. {
  653.     Handle bLinesH = Get1Resource('STR#',BOX_LINES_STRN);
  654.     Str31 num;
  655.     short i,spot,last=0,offset = 0;
  656.     
  657.     if (!bLinesH)
  658.     {
  659.         if (!(bLinesH=NewZHandle(2))) return;
  660.         *num = 0;
  661.         AddResource(bLinesH,'STR#',BOX_LINES_STRN,num);
  662.     }
  663.     
  664.     for (i=0;i<WID_LIMIT;i++)
  665.     {
  666.         spot = (*BoxLines)[i];
  667.         if (spot-last==3) {offset += 3; spot -= offset;}
  668.         spot /= FontWidth;
  669.         NumToString(spot,num);
  670.         ChangeStrn(BOX_LINES_STRN,i+1,num);
  671.         last = (*BoxLines)[i];
  672.     }
  673.     UpdateResFile(SettingsRefN);
  674.     GetBoxLines();
  675. }
  676.  
  677. /**********************************************************************
  678.  * BadPrefItem - vet a preferences dialog.    Saves preferences if
  679.  * ok, otherwise scolds the user.  Returns index of offending value,
  680.  * or 0 if everything is ok.
  681.  **********************************************************************/
  682. int BadPrefItem(DialogPtr dialog)
  683. {
  684.     Str255 newValue,scratch;
  685.     int dItem;
  686.     char *where;
  687.     
  688.     /*
  689.      * check each value for reasonableness
  690.      */
  691.     for (dItem=NPRDL_POP; dItem <= NPRDL_PRINT_FONT_SIZE; dItem++)
  692.     {
  693.         GetDIText(dialog,dItem,newValue);
  694.         if (*newValue==sizeof(Str255)-1) (*newValue)--;
  695.         newValue[*newValue+1] = 0;
  696.         switch (dItem)
  697.         {
  698.             case NPRDL_POP:
  699. #ifndef POPSECURE
  700.                 if (*newValue && newValue[1]=='!') break;
  701. #endif
  702.                 where=strchr(newValue+1,'@');
  703.                 if (where==nil || where==newValue+1 || where==newValue+*newValue)
  704.                 {
  705.                     GetRString(newValue,EXPL_POP);
  706.                     DoABigAlert(Note,newValue);
  707.                     return(dItem);
  708.                 }
  709.                 break;
  710.             case NPRDL_SMTP:
  711.                 where=strchr(newValue+1,'@');
  712.                 if (where!=nil)
  713.                 {
  714.                     GetRString(newValue,EXPL_SMTP);
  715.                     DoABigAlert(Note,newValue);
  716.                     return(dItem);
  717.                 }
  718.                 break;
  719.             case NPRDL_PH:
  720.                 where=strchr(newValue+1,'@');
  721.                 if (where!=nil)
  722.                 {
  723.                     GetRString(newValue,PH_EXPL);
  724.                     DoABigAlert(Note,newValue);
  725.                     return(dItem);
  726.                 }
  727.                 break;
  728.             case NPRDL_RETURN:
  729.                 break;
  730.             case NPRDL_INTERVAL:
  731.                 for (where=newValue+1;where<newValue+*newValue+1;where++)
  732.                     if (!isdigit(*where))
  733.                     {
  734.                         GetRString(newValue,EXPL_INTERVAL);
  735.                         DoABigAlert(Note,newValue);
  736.                         return(dItem);
  737.                     }
  738.                 break;
  739.             case NPRDL_MHEIGHT:
  740.             case NPRDL_MWIDTH:
  741.             case NPRDL_PRINT_FONT_SIZE:
  742.                 if (!*newValue) break;
  743.             case NPRDL_FONT_SIZE:
  744.                 for (where=newValue+1;where<newValue+*newValue+1;where++)
  745.                     if (!isdigit(*where))
  746.                     {
  747.                         ComposeRString(scratch,FONTSIZE_EXPL,newValue);
  748.                         DoAnAlert(Note,scratch);
  749.                         return(dItem);
  750.                     }
  751.                 break;
  752.         }
  753.     }
  754.     return(0);
  755. }
  756.